#pragma once

#include "EventEntry.h"
#include "GroupEntry.h"
#include "ObjectArray.h"

#include <adwaita.h>

G_BEGIN_DECLS

#define EVENT_TYPE_MAIN_PAGE (event_main_page_get_type())
G_DECLARE_FINAL_TYPE(EventMainPage, event_main_page, EVENT, MAIN_PAGE, AdwBin)

typedef enum
{
	MAIN_PAGE_SIGNAL_ADD_GROUP = 0,
	/* 提出一条事件修改的请求 */
	MAIN_PAGE_SIGNAL_MODIFY_EVENT = 1,
	/* 提出删除一条事件的请求 */
	MAIN_PAGE_SIGNAL_REMOVE_EVENT = 2,
	/* 提出加入事件组的请求 */
	MAIN_PAGE_SIGNAL_JOIN_GROUP = 3,
	MAIN_PAGE_SIGNAL_END,
} MainPageSignal;

/**
 * 将 ObjectArray 模板应用到用户组列表中。
 * 请注意！本方法将会接管 ObjectArray 对象。
 */
extern void event_main_page_take_group_array(EventMainPage *self,
					     ObjectArray   *array);

/**
 * 刷新 EventMainPage 的所有内容
 */
extern void event_main_page_update_all_content(EventMainPage *self);

/**
 * 将 ObjectArray 模板应用到事件列表中。
 * 请注意！本方法将会接管 ObjectArray 对象。
 */
extern void event_main_page_take_event_array(EventMainPage *self,
					     ObjectArray   *array);

/**
 * 是否显示侧边栏？
 */
extern void event_main_page_set_sidebar(EventMainPage *self,
					bool	       will_show_sidebar);

/**
 * 获取一个可修改的事件组列表。若无可修改事件组，返回 NULL。
 * 请注意！ObjectArray 的所有权已转移给接收者。
 */
extern ObjectArray *event_main_page_dup_usable_group_array(EventMainPage *self);

/**
 * 获取新增组输入的信息
 */
extern const char *event_main_page_get_group_name(EventMainPage *self);
extern bool	   event_main_page_get_group_writable(EventMainPage *self);
extern bool	   event_main_page_get_group_joinable(EventMainPage *self);

/**
 * 添加一条组到侧边栏。请注意！本方法将接管 GroupEntry。
 */
extern void event_main_page_add_group_to_sidebar(EventMainPage *self,
						 GroupEntry    *group_entry);

/**
 * 添加一条事件到窗口。请注意！本方法将接管 EventEntry。
 */
extern void event_main_page_add_event_to_content(EventMainPage *self,
						 EventEntry    *event_entry);

/**
 * 获取输入的 GroupID
 */
extern void event_main_page_take_joined_group_name(EventMainPage *self,
						   EventString	 *group_name);

/* 新建事件的窗口 */
extern void event_main_page_create_new_event(EventMainPage *self);

G_END_DECLS
